package com.ntd.study.base.type.arrays;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Map 相关内容
 * 哈希表 hash table
 * 也叫做散列表
 * HashMap 线程不安全、允许一个null键
 * hashTable 线程安全、不允许null键
 * treeMap 线程不安全
 */
public class MapDemo {
    /**
     * Map 接口
     */
    Map map;

    /**
     * AbstractMap
     * Map 抽象类
     */
    AbstractMap abstractMap;

    /**
     * TreeMap类型专用接口-补充treeMap需要的方法
     */
    SortedMap sortedMap;

    /**
     * hashMap
     * 常用的map类型
     * 继承 AbstractMap
     * 实现 Map<K, V>, Cloneable, Serializable
     * 1.实现 数组+链表+红黑树
     * 2.hash 1.8版本以后进行高16位和低16位的异或操作，也叫扰动函数，降低hash碰撞，越分散越好，hashcode - 32位的int值
     * 3.数组下标计算 hash（key） & lenth-1, 数组长度取2的整数幂，因为这样（数组长度-1）正好相当于一个“低位掩码”。“与”操作的结果就是散列值的高位全部归零，只保留低位值
     */
    HashMap hashMap;

    /**
     * HashTable
     * 1.线程安全
     */
    Hashtable hashtable;

    /**
     * 1.线程安全
     * 2.分段锁 - 多线程情况下只会锁住当前操作索引的节点
     */
    ConcurrentHashMap concurrentHashMap;

    /**
     * 1.内部使用链表结构 - 并且保存头尾节点 - Entry内部除了继承HashMap的Node属性，还有before和after用于标识前置节点和后置节点
     */
    LinkedHashMap linkedHashMap;

    /**
     * 1.内部使用红黑树实现
     * 2.排序 - 自然排序 - 自定义排序，实现Comparable接口，或者传入Comparator比较器
     */
    TreeMap treeMap;

    /**
     * 弱引用map - 对象会被回收
     */
    WeakHashMap weakHashMap;

    /**
     * 1.key 比较采用引用比较  也就是  k1 == k2
     */
    IdentityHashMap identityHashMap;


    public static void main(String[] args) {
        Map map = new HashMap();
        Hashtable hashtable = new Hashtable(); // 线程安全
        final Map map1 = Collections.synchronizedMap(map); // 线程安全
        ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap(); // 线程安全 - 采用分段锁 - 性能高于前两个


    }
}
